﻿

using DataService.Core.ServiceDTO;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;

namespace DataService.IService
{
    public interface IDatabaseProvider : IDisposable
    {
        DbConnection DbConnection { get; }
        DbTransaction Transaction { get; }

        /// <summary>
        /// Read Uncommitted: 允许读取脏数据，一个事务能看到另一个事务还没有提交的数据。（不会阻止其它操作）；允许读取尚未更改的提交，可能导致脏读、幻读或不可重复读。
        /// Read Committed: 确保事务读取的数据都必须是已经提交的数据。它限制了读取中间的，没有提交的，脏的数据,；Oracle默认级别，允许从已经提交的并发事务读取，可防止脏读，但幻读和不可重复读可能会发生。
        /// 但是它不能确保当事务重新去读取的时候，读的数据跟上次读的数据是一样的，也就是说当事务第一次读取完数据后，
        /// 该数据是可能被其他事务修改的，当它再去读取的时候，数据可能是不一样的。（数据隐藏，不阻止）
        /// Repeatable Read: 是一个更高级别的隔离级别，如果事务再去读取同样的数据，先前的数据是没有被修改过的。（阻止其它修改）。；MySQL默认级别，对相同字段的多次读取的结果是一致的，除非数据被当前事务本身改变。可防止脏读和不可重复读，但幻读可能发生。
        /// Serializable: 它做出了最有力的保证，除了每次读取的数据是一样的，它还确保每次读取没有新的数据。（阻止其它添删改）。
        /// 默认：Read Committed
        /// </summary>
        IsolationLevel _IsolationLevel { get; set; }
        /// <summary>
        ///提交数据
        /// </summary>
        void Commit();
        /// <summary>
        /// 回滚事务
        /// </summary>
        void Rollback();


        #region 数据库连接相关
        /// <summary>数据库类型</summary>
        DatabaseType DBType { get; }

        /// <summary>数据库提供者工厂</summary>
        DbProviderFactory ProviderFactory { get; }

        Type DatabaseProviderType { get; }

        /// <summary>表后缀；</summary>
        String TableSuffix { get; set; }

        /// <summary>链接字符串</summary>
        String ConnectionString { get; set; }

        /// <summary>数据库名/表空间</summary>
        String DatabaseName { get; set; }
        /// <summary>
        /// 服务器名称
        /// </summary>
        string ServerName { get; }
        /// <summary>
        /// 模式名（有些数据库Owner是模式名）；默认是登录名
        /// </summary>
        public string Schema { get; set; }
        /// <summary>
        /// 登录用户
        /// </summary>
        public string User { get; }

        /// <summary>
        /// 是否启用 自动建表 建库；true:开启；false: 不开启 ；默认false 
        /// </summary>
        public bool IsEnable { get; set; }

        #endregion

        #region 辅助参数

        #endregion

    }
}
